/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
/*
 * bocciawii
 * Copyright (C) Grupo de trabajo ULE 2010 <ulewii@googlegroups.com>
 * 
 * bocciawii is free software: you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by the
 * Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 * 
 * bocciawii is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License along
 * with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

#ifndef _RENDER_H_
#define _RENDER_H_
#include <SDL/SDL.h>
#include <SDL/SDL_opengl.h>
#include <GL/gl.h>
#include <GL/glu.h>

#include <cmath>

#include "error-log.h"
#include "obj-loader.h"
#include "camara.h"

#define SDL_VIDEO_FLAGS SDL_OPENGL | SDL_FULLSCREEN

/**
 * @brief Estructura para almacenar las opciones de la aplicación
 *
 * Guardará el tamaño de letra del HUD, y el tamaño de la pantalla.
 */
typedef struct
{
	int tam_letra;
	int width;
	int height;
} opciones_aplicacion;


/**
 * Gestión de la pantalla y de luces
 */
class Render
{
public:

	/**
	 * @brief Nuestro constructor.
	 * Inicializa la pantalla dado un tamaño
	 * @param width Anchura de la ventana
	 * @param height Altura de la ventana
	 * @param bpp Bits de profundidad (No se usa)
	 */
	Render(opciones_aplicacion* opciones);
	~Render();

	/**
	 * @brief Inicializa un contexto de OpenGL a través de SDL
	 * @return 0 si todo va bien
	 */
	int IniciaPantalla();

	/**
	 * @brief Inicializa parámetros de la aplicación específicos de OpenGL
	 */
	void InitSDLGL();
	
	/**
	 * @brief Pone el punto de vista de la escena
	 */
	void Mirar();

	/**
	 * @brief Cuando la escena esté totalmente dibujada, este método la mostrará
	 */
	void Mostrar();

	/**
	 * @brief Obtener tamaño horizontal del contexto creado
	 * @return tamaño horizontal del contexto
	 */
	inline int X ()
	{ return _opciones->width; }
	
	/**
	 * @brief Obtener tamaño vertical del contexto creado
	 * @return tamaño vertical del contexto
	 */
	inline int Y ()
	{ return _opciones->height; }

	Camara* camaras; /// Gestión de las cámaras
		
protected:

private:
	void InitLights();
	void ResetLights();

		
	float aspecto_vertical;
	float aspecto_horizontal;
	float znear, zfar;
	
	opciones_aplicacion* _opciones;

	int antialiasing;

	ErrorLog* log; /// Puntero a nuestra clase para Log
	SDL_Surface* pantalla; /// El contexto de SDL sobre el que dibujaremos

};

#endif // _RENDER_H_
